// 入口文件

// 加载模块
let path = require('path');
let express = require('express');
let usersRouter = require('./routers/usersRouter.js');
let goodsRouter = require('./routers/goodsRouter.js');

// 连接数据库
require('./db/connect.js');

// 创建express实例
let app = express();


/* // 执行cookie操作:
// 服务端使用cookie-parser来操作cookie

// 1.安装插件
// npm i cookie-parser

// 2.加载模块
let cookieParser = require('cookie-parser');

// 3.使用cookieParser插件
app.use(cookieParser());
// 当使用cookieParser插件之后：
// 在req对象有一个cookies属性，包含前端携带过来的cookie数据
// 在res对象有一个cookie方法，用于设置cookie数据
app.get('/cookie',(req,res)=>{
    // 获取cookie数据
    console.log( req.cookies );// { user1: 'xiaocuo', user2: 'xiaomei' }

    // 设置cookie数据（在响应头设置）
    res.cookie('user3','xiaolai',{
        maxAge: 1000*60*60*8,// 设置有效期
        domain: 'localhost',// 设置域名
        path: '/' // 设置路径
    });

    res.send('/cookie is ok');
}) */


// session会话控制
// 前端和后端的会话
// 在web应用中，cookie是一种记录用户状态的机制，cookie数据存储在客户端
// 在web应用中，session是一种记录用户状态的机制，session数据存储在服务端

// session的使用依赖于cookie
// session由两部分组成：session id 和 session data
// session id 存储在浏览器cookie中（key）
// session data 存储在服务器内存/数据库中（value）

// 在express中使用express-session插件来操作session
// express-session插件会自动操作cookie（获取和设置）

/* // 1.安装插件
// npm i express-session
// 2.加载插件
let session = require('express-session');
// 3.使用插件
app.use('/',session({// session配置
    resave: true,// 是否重新存储session（自动延长有效期）
    saveUninitialized: false,// 是否存储未初始化的session
    secret: 'hehe123',// 加密口令
    name: 'nicai',// 存储session id的cookie的key
    cookie: {
        maxAge: 1000*60*60*8,// 有效期
        domain: 'localhost',// 域名
        path: '/',// 路径
    }
}));

// 使用了express-session插件后：
// 1.通过响应头设置客户端的cookie来存储session id（门禁卡）
// 2.在req对象中添加了一个session属性session data（门禁卡对应的数据）
app.get('/session',(req,res)=>{
    console.log( req.session );// 存储在服务器的session data
    // req.session = {
    //     cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }
    // }

    // 向session中存储数据（初始化）
    req.session.hehe = '123';

    res.send('/session id ok');
}) */


/* // 在nodejs中使用JWT:
// 1.下载安装
// npm i jsonwebtoken
// 2.加载模块
let jwt = require('jsonwebtoken');
// 3.生成JWT类型的token
// let token = jwt.sign(参数1，参数2，参数3);
// 参数1：{要保存的信息} 当前登录的用户信息
// 参数2：口令，加密和解密要用的口令
// 参数3：其他设置 {expiresIn:时间} 时间单位为 秒 或 '1d'  '7d'
let token = jwt.sign({'user':'xiaocuo','nick':'小错'},'hehehaha',{expiresIn:3});
// console.log( token );// 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoieGlhb2N1byIsIm5pY2siOiLlsI_plJkiLCJpYXQiOjE2ODk2NjkyMDEsImV4cCI6MTY4OTY2OTIwNH0.edcY6XunTjYZaDKtSdPPTiZx9DAVedhKRAonnf7dvRU'

// 4.验证token
// jwt.verify(参数1，参数2，参数3);
// 参数1：要验证的token字符串
// 参数2：口令，与生成token时的口令一样
// 参数3：回调函数，解析token之后执行的函数

// 验证1：正常验证
setTimeout(()=>{
    jwt.verify(token,'hehehaha',(err,payload)=>{
        if (err) {
            // 有错误
            console.log( '错误',err );
        } else {
            // 没错误
            console.log( '数据',payload );
            // payload = { user: 'xiaocuo', nick: '小错', iat: 1689669201, exp: 1689669204 }
        }
    })
},2000); */

/* // 验证2：token过期
setTimeout(()=>{
    jwt.verify(token,'hehehaha',(err,payload)=>{
        if (err) {
            // 有错误
            console.log( '错误',err );// TokenExpiredError: jwt expired
        } else {
            // 没错误
            console.log( '数据',payload );
        }
    })
},4000); */

/* // 验证3：口令错误
setTimeout(()=>{
    jwt.verify(token,'hehehahe',(err,payload)=>{
        if (err) {
            // 有错误
            console.log( '错误',err );// TJsonWebTokenError: invalid signature
        } else {
            // 没错误
            console.log( '数据',payload );
        }
    })
},2000); */

/* // 验证4：伪造token
setTimeout(()=>{
    jwt.verify(token+'abc','hehehahe',(err,payload)=>{
        if (err) {
            // 有错误
            console.log( '错误',err );// TJsonWebTokenError: invalid signature
        } else {
            // 没错误
            console.log( '数据',payload );
        }
    })
},2000);
 */
// 配置CORS跨域资源共享：

// 1.使用cors中间件实现跨域资源共享
// 安装cors
// npm i cors
// 加载模块
let cors = require('cors');
// 使用cors中间件
app.use(cors());

/* // 2.设置响应头信息
// * 表示匹配所有请求路径
app.all('*',(req,res,next)=>{
    // 设置允许请求的域名，*表示所有域名
    res.header('Access-Control-Allow-Origin','*');
    // 设置允许的header类型
    res.header('Access-Control-Allow-Headers','Content-Type');
    // 设置允许的请求方式
    res.header('Access-Control-Allow-Methods','GET,POST');
    next();// 放行
});
// app.get()
// app.post()
// ...
// app.all相当于app.get和app.post等所有请求方式的集合 */

// 解析请求体
app.use(express.json());// 解析application/json数据
app.use(express.urlencoded({extended:true}));// 解析application/x-www-form-urlencoded数据

// 使用路由表匹配用户请求
// http://localhost:9999/goods/del
app.use('/users',usersRouter);
app.use('/goods',goodsRouter);

// 设置静态资源目录
// http://localhost:9999/static/b1.jpg
app.use('/static',express.static(path.join(__dirname,'www')));

// 监听端口号
app.listen(9999,()=>{
    console.log( '--------------server is ok--------------' );
});
